package com.bnz.cart.service.impl;

import com.alibaba.fastjson.JSON;
import com.bnz.cart.entity.Item;
import com.bnz.cart.entity.OrderItem;
import com.bnz.cart.entity.group.Cart;
import com.bnz.cart.mapper.ItemMapper;
import com.bnz.cart.service.CartService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {
	@Autowired
	private ItemMapper itemMapper;
	@Autowired
	private StringRedisTemplate redisTemplate;

	//添加购物车
	@Override
	public List<Cart> add(Long id, int num,String name) {
		//根据sku商品id，查询item对象
		Item item = itemMapper.selectById(id);
		//根据登录名从redis中得到购物车列表
		String cartListStr = redisTemplate.opsForValue().get(name);
		//处理兼容性
		if(StringUtils.isBlank(cartListStr)){
			cartListStr = "[]";
		}
		//得到购物车列表
		List<Cart> cartList = JSON.parseArray(cartListStr,Cart.class);

		//sellerId为商家id
		//在cartList中根据item对象中的sellerId值判断是否存在购物车
		//根据item中的sellerId判断是否有购物车
		Cart cart = findCartBySellerId(item.getSellerId(),cartList);
		//如果有此购物车，就将商品添加到此购物车中
		if(cart != null){
			//在此购物车的购物项列表中查询是否有此商品
			List<OrderItem> orderItemList = cart.getOrderItemList();
			OrderItem tbItem = findItemById(orderItemList,id);
			//如果存在订单项商品，就修改数量及小计
			if(tbItem != null){
				//① 修改订单项商品的数量
				tbItem.setNum(tbItem.getNum() + num);
				//② 计算小计   bigDecimal (科学计算常用精度较高。)
				tbItem.setTotalFee(new BigDecimal(tbItem.getPrice().doubleValue()*tbItem.getNum()));
			}else{  //如果没有此商品就创建此商品
				tbItem = createOrderItem(item,num);
				// 将商品放到购物车的购物项列表中
				cart.getOrderItemList().add(tbItem);
			}
			//特殊情况处理一：
			//如果购物车的购物列表中的某件商品的数量为0，就要从此购物车的订单项列表中移除此商品
			if(tbItem.getNum() == 0){
				cart.getOrderItemList().remove(tbItem);
			}
			//特殊情况处理二：
			//如果购物车的购物项列表为null，此时就要从购物车列表中删除此购物车
			if(cart.getOrderItemList().size() == 0){
				cartList.remove(cart);
			}

		}else{ //如果没有此购物车，就创建新的购物车，并将此商品添加到购物车中的购物项列表中
			//创建购物车,同时将此商品添加到新创建的购物车的购物项列表中
			cart = createCart(item,num);
			//将此购物车添加到购物车列表中
			cartList.add(cart);
		}
		//将购物车列表放到redis中，以当前登录名为key
		redisTemplate.opsForValue().set(name, JSON.toJSONString(cartList));
		return cartList;
	}



	//根据sellerId查找是否有购物车
	private Cart findCartBySellerId(String sellerId,List<Cart> cartList) {
		for (Cart cart : cartList) {
			if(cart.getSellerId().equals(sellerId)){
				return cart;
			}
		}
		return null;
	}

	//在购物项列表中查询是否有此商品
	private OrderItem findItemById(List<OrderItem> orderItemList, Long id) {
		for (OrderItem orderItem : orderItemList) {
			if(orderItem.getItemId().longValue() == id.longValue()){
				return orderItem;
			}
		}
		return null;
	}

	//创建订单项商品
	private OrderItem createOrderItem(Item item, int num) {
		//4.1 构造对象OrderItem
		OrderItem orderItem = new OrderItem();
		orderItem.setGoodsId(item.getGoodsId());
		orderItem.setNum(num);
		orderItem.setItemId(item.getId());
		orderItem.setPrice(item.getPrice());
		orderItem.setPicPath(item.getImage());
		orderItem.setSellerId(item.getSellerId());
		orderItem.setTitle(item.getTitle());
		orderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue() * num));

		return orderItem;
	}

	//创建购物车
	private Cart createCart(Item item, int num) {
		//创建购物车
		//定义购物项集合
		List<OrderItem> orderItemList = new ArrayList<>();
		//创建购物车
		Cart cart = new Cart(item.getSellerId(),item.getSeller(),orderItemList);
		//为购物车的购物项列表添加商品
		//创建购物车的购物项的商品
		OrderItem orderItem = createOrderItem(item, num);
		//将此商品放到购物项列表中
		orderItemList.add(orderItem);
		//返回购物车
		return cart;
	}

	//从redis中获取购物车列表
	@Override
	public List<Cart> getCartList(String name) {
		String s = redisTemplate.opsForValue().get(name);
		if(StringUtils.isNotBlank(s)){
			return JSON.parseArray(s,Cart.class);
		}
		return new ArrayList<>();
	}
}
